/*
 * SchemaTag.java
 *
 * Created on 22 marzo 2004, 11.43
 */

package net.ermannofranco.xml.schema;

import net.ermannofranco.xml.AbstractTag;
import net.ermannofranco.xml.Indent;
import net.ermannofranco.xml.Static;
import net.ermannofranco.xml.Tag;

/**
 * classe di passaggio per implementare alcuni
 * metodi comuni.
 * non posso farla astratta perche' devo comunque istanziare nel passaggio verso tag, tantomeno interfaccia
 */

/**
 * 
 * @author ermanno (ermanno.franco@gmail.com)
 */
public class SchemaTag extends Tag implements ISchemaTag {

	private static final long serialVersionUID = 8799941338270120380L;
	private boolean built;
	private boolean annotated;

	/**
	 * Creates a new instance of SchemaTag Protetto
	 * 
	 * @param level
	 *            livello di indentazione
	 * @param container
	 *            tag contenitore
	 */
	protected SchemaTag(String nome, int level, ISchemaTag container) {
		super(nome, level, container);
	}

	protected Annotation addAnnotation() {
		if (annotated)
			throw new SchemaException("annotation already written!!");
		Annotation a;
		add(a = new Annotation(getLevel() + 1, this), true);
		annotated = true;
		return a;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.ermannofranco.xml.schema.ISchemaTag#setId(java.lang.String)
	 */
	public final ISchemaTag setId(String ID) {
		Static.validateID(ID);
		addAttr("id", ID);
		return this;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see net.ermannofranco.xml.schema.ISchemaTag#getFormPrefix()
	 */
	public final String getFormPrefix() {
		if (getSchemaContainer() == null) {
			return null;
		}
		if (Schema.class.isAssignableFrom(getSchemaContainer().getClass())) {
			Schema s = (Schema) getContainer();
			return s.getFormPrefix();
		}
		// ricorsivo, risale l'albero finche' trova
		return getSchemaContainer().getFormPrefix();
	}

	protected final String feedFormPrefix(String typeName) {
		String fp = getFormPrefix();
		return (fp == null || fp.length() == 0) ? typeName
				: (fp + Static.COLON + typeName);
	}

	private ISchemaTag getSchemaContainer() {
		return (ISchemaTag) getContainer();
	}

	// rifletterci sopra
	/*
	 * (non-Javadoc)
	 * 
	 * @see net.ermannofranco.xml.schema.ISchemaTag#addTag(java.lang.String)
	 */
	public final Tag addTag(String nome) {
		throw new SchemaException("Proibito usare Tag personalizzati in Schema");
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * net.ermannofranco.xml.schema.ISchemaTag#addTextBlock(java.lang.String)
	 */
	public AbstractTag addTextBlock(String testo) {
		throw new SchemaException(
				"Proibito inserire testo personalizzato in Schema");
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * net.ermannofranco.xml.schema.ISchemaTag#removeAttribute(java.lang.String)
	 */
	public String removeAttribute(String nome) {
		throw new SchemaException("Proibito rimuovere attributi in Schema");
	}

}
